from math import pow, fabs


class getD:
    def __init__(self,IVQ1,IVQ2,q):
        '''

        :param IVQ1:
        :param IVQ2:
        :param q:
        '''
        self.IVQ1=IVQ1
        self.IVQ2=IVQ2
        self.q=q
        self.list_function=[self.func1]

    def getDistance(self,numb=0):
        '''
        function: 选取距离公式
        :return: 距离公式的计算结果
        '''
        try:
            return self.list_function[numb]()
        except:
            print("下标索引的距离公式不存在")
            return self.list_function[0]()


    def get_pi(self, a, *waste1, **waste2):
        """
            function : 求犹豫度 —— 求 d 即 get_d 中会用到
            a        : 一个模糊集, 形式:（[x,y]，[x,y]）
            *waste1  : 回收多余的输入参数
            **waste2 : 回收多余的输入键值对参数
            return   : 犹豫度列表，形式： [x,y]
        """
        pi_f = pow((1 - pow(a[0][1], self.q) - pow(a[1][1], self.q)), 1 / self.q)
        pi_r = pow((1 - pow(a[0][0], self.q) - pow(a[1][0], self.q)), 1 / self.q)
        return [pi_f, pi_r]

    def func1(self, *waste1, **waste2):
        """
            function : 求用于计算支撑度中用到的 d
            a1       : 一个模糊集, 形式:（[x,y]，[x,y]）
            a2       : 一个模糊集, 形式:（[x,y]，[x,y]）
            *waste1  : 回收多余的输入参数
            **waste2 : 回收多余的输入键值对参数
            return   : d 的值
        """
        # 提取隶属区间的上下界、非隶属区间的上下界限、犹豫度的上下界限
        a1=self.IVQ1
        a2=self.IVQ2
        u_1_f, u_1_r, v_1_f, v_1_r, pi_1_f, pi_1_r = *a1[0], *a1[1], *self.get_pi(a1)
        u_2_f, u_2_r, v_2_f, v_2_r, pi_2_f, pi_2_r = *a2[0], *a2[1], *self.get_pi(a2)

        # 将公式分为三个部分：隶属区间u、费隶属区间v、犹豫度π
        part_u = fabs(u_1_f ** self.q - u_2_f ** self.q) + fabs(u_1_r ** self.q - u_2_r ** self.q)
        part_v = fabs(v_1_f ** self.q - v_2_f ** self.q) + fabs(v_1_r ** self.q - v_2_r ** self.q)
        part_r = fabs(pi_1_f ** self.q - pi_2_f ** self.q) + fabs(pi_1_r ** self.q - pi_2_r ** self.q)

        # 整合三个部分的公式
        d_value = 1 / 4 * (part_u + part_v + part_r)
        return d_value




if __name__ == '__main__':
    list1 = [([0.85, 0.95], [0.1, 0.2]), ([0.8, 0.9], [0.1, 0.2]), ([0.85, 0.95], [0.1, 0.2]), ([0.7, 0.8], [0.2, 0.3]),
             ([0.4, 0.5], [0.5, 0.6])]
    print(getD(list1[0],list1[1],3).getDistance())